home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / tcclib.exe / lha / GETFILE.C < prev    next >
Text File  |  1990-02-07  |  5KB  |  205 lines

  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <Gcomm.h>
  4. #include <alloc.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7.  
  8. typedef struct {
  9.              char Name[9];
  10.              char Ext[4];
  11.              char Attribute;
  12.     unsigned int  Date;
  13.     unsigned int  Time;
  14.     unsigned long Size;
  15.              int  Tag;
  16. } FileStruc;
  17.  
  18. typedef struct {
  19.     char Name[13];
  20. } FileNameStruc;
  21.  
  22. #define MAXFILES 500
  23.  
  24. FileStruc *ScanDir( char *Mask, int Type );
  25. char *FileName( FileStruc *f );
  26.  
  27. int  GComm( void );
  28. void HideCursor( void );
  29. void BlockErase( int x, int y, int xx, int yy );
  30. void DrawBox( int x, int y, int xx, int yy );
  31. void DrawBox1( int x, int y, int xx, int yy );
  32. void HLin( int x, int y, int xx, int yy );
  33. void ChangeBlock( int x, int y, int xx, int yy, unsigned char attrib );
  34. void AtSay( int x, int y, register char *s );
  35. void AtSayF( int x, int y, char *fmt, ... );
  36. void NPrintFA( int len, unsigned char attrib, char *fmt, ... );
  37. int  GetLine( char *s, int len, int start );
  38. void TcclibInitialize( void );
  39.  
  40. extern int ScdirDone;
  41. extern unsigned char A_NORMAL;
  42. extern unsigned char A_REVERSE;
  43.  
  44. int CompareFileNames( FileNameStruc *A, FileNameStruc *B )
  45. {
  46.     return( strcmp( A->Name, B->Name ) );
  47. }
  48.  
  49. char *GetFile( int x, int y, int xx, int yy,
  50.              char *Mask, int FileAttrib, int ExtOn )
  51. {
  52.     register FileNameStruc *File;
  53.     register int i;
  54.     int j, cols, rows, Width, files, top, oldptr, oldtop;
  55.     static char RetName[15];
  56.     FileStruc *fp;
  57.     int ptr;
  58.     char *Scr1, *Scr2;
  59.     int ch;
  60.  
  61.     TcclibInitialize();
  62.  
  63.     cols = xx - x + 1;
  64.     rows = yy - y + 1;
  65.     if ( cols < 14 || rows < 4 ) return( NULL );
  66.     if ( ( Scr1 = (char *) calloc( rows*2, cols ) ) == NULL )
  67.         return( NULL );
  68.     if ( ( Scr2 = (char *) calloc( 6, 14 ) ) == NULL )
  69.         return( NULL );
  70.     if ( ( File = (FileNameStruc *) calloc( MAXFILES, 13 ) ) == NULL )
  71.         return( NULL );
  72.     gettext( x, y, xx, yy, Scr1 );
  73.     BlockErase( x, y, xx, yy );
  74.     DrawBox( x, y, xx, yy );
  75.     gotoxy( x+1, y );
  76.     NPrintFA( cols-4, A_REVERSE, " %s ", Mask );
  77.     x++;
  78.     y++;
  79.     xx--;
  80.     yy--;
  81.     files = 0;
  82.     ScdirDone = 1;
  83.     while ( ( fp = ScanDir( Mask, FileAttrib ) ) != NULL && files < MAXFILES-1 ) {
  84.         if ( ExtOn )
  85.             strcpy( File[files++].Name, FileName( fp ) );
  86.         else
  87.             strcpy( File[files++].Name, fp->Name );
  88.     }
  89.     if ( ExtOn )
  90.         Width = 14;
  91.     else
  92.         Width = 10;
  93.     rows -= 2;
  94.     cols = (xx - x + 3) / Width;
  95.  
  96.     qsort(  File, files, sizeof( FileNameStruc ), CompareFileNames );
  97.  
  98.     top = 0;
  99.  
  100. RedrawFiles:
  101.  
  102.     BlockErase( x, y, xx, yy );
  103.     if ( top > 0 )
  104.         AtSay( xx-9, yy+1, "PgUp/" );
  105.     else
  106.         HLin( xx-9, yy+1, xx-5, yy+1 );
  107.     if ( cols * rows + top < files ) {
  108.         AtSay( xx-4, yy+1, "PgDn" );
  109.     }
  110.     else
  111.         HLin( xx-5, yy+1, xx-1, yy+1 );
  112.  
  113.     for ( i=0;  i<cols;  ++i )
  114.         for ( j=0;  j<rows;  ++j )
  115.             if ( files > ( i * rows + j + top ) )
  116.                 AtSayF( x + Width * i, y + j,
  117.                         "%s", File[i * rows + j + top].Name );
  118.  
  119.     ptr = 0;
  120.  
  121.     for (;;) {
  122.  
  123.         ChangeBlock( x, y, xx, yy, A_NORMAL );
  124.         ChangeBlock( x + ( ptr / rows * Width ),
  125.                      y + ( ptr % rows ),
  126.                      x + ( ptr / rows * Width ) + Width - 3,
  127.                      y + ( ptr % rows ),
  128.                      A_REVERSE );
  129.  
  130.         oldptr = ptr;
  131.         oldtop = top;
  132.         HideCursor();
  133.         switch( ch = GComm() ) {
  134.             case CR:
  135.                 strcpy( RetName, File[ptr + top].Name );
  136.                 puttext( x-1, y-1, xx+1, yy+1, Scr1 );
  137.                 free( Scr1 );
  138.                 free( Scr2 );
  139.                 free( File );
  140.                 return( RetName );
  141.             case ESC:
  142.                 puttext( x-1, y-1, xx+1, yy+1, Scr1 );
  143.                 free( Scr1 );
  144.                 free( Scr2 );
  145.                 free( File );
  146.                 return( NULL );
  147.             case DOWN:
  148.                 if ( ptr < rows * cols - 1 )
  149.                     ptr++;
  150.                 break;
  151.             case UP:
  152.                 if ( ptr )
  153.                     ptr--;
  154.                 break;
  155.             case RIGHT:
  156.                 if ( ptr < rows * cols - rows )
  157.                     ptr += rows;
  158.                 break;
  159.             case LEFT:
  160.                 if ( ptr >= rows )
  161.                     ptr -= rows;
  162.                 break;
  163.             case PGDN:
  164.                 if ( top + rows * cols < files ) {
  165.                     top += rows * cols;
  166.                     goto RedrawFiles;
  167.                 }
  168.                 break;
  169.             case PGUP:
  170.                 if ( top ) {
  171.                     top -= rows * cols;
  172.                     if ( top < 0 ) top = 0;
  173.                     goto RedrawFiles;
  174.                 }
  175.                 break;
  176.             default:
  177.                 if ( ch > ' ' && ch < 128 ) {
  178.                     gettext( x-1, y, x+12, y+2, Scr2 );
  179.                     BlockErase( x-1, y, x+12, y+2 );
  180.                     DrawBox1( x-1, y, x+12, y+2 );
  181.                     AtSay( x+2, y, "New File" );
  182.                     gotoxy( x, y+1 );
  183.                     putch( ch );
  184.                     memset( RetName, 0, sizeof (RetName) );
  185.                     RetName[0] = ch;
  186.                     if ( -1 == GetLine( RetName, 12, 1 ) ) {
  187.                         puttext( x-1, y, x+12, y+2, Scr2 );
  188.                         break;
  189.                     }
  190.                     puttext( x-1, y-1, xx+1, yy+1, Scr1 );
  191.                     free( Scr1 );
  192.                     free( Scr2 );
  193.                     free( File );
  194.                     return( RetName );
  195.                 }
  196.                 break;
  197.         }
  198.         if ( top < 0 ) top = 0;
  199.         if ( !strlen( File[top+ptr].Name ) ) {
  200.             ptr = oldptr;
  201.             top = oldtop;
  202.         }
  203.     }
  204. }
  205.